/* 
泛型:
    指在定义函数、接口或类的时候，不预先指定具体的类型，而在使用的时候再指定具体类型的一种特性。

需求:
  创建一个函数, 实现功能: 根据指定的数量 count 和数据 value , 创建一个包含 count 个 value 的数组
*/

(() => {
  function createArray(count: number, value:any) {
    const result: any[] = []
    for (let index = 0; index < count; index++) {
      result.push(value)
    }
    return result
  }

  const arr1 = createArray(5, 12.34)
  const arr2 = createArray(5, '12.34')

  // console.log(arr1[0].toFixed2())
  // console.log(arr2[0].length2)
  /* 
  函数泛型

  1. 声明泛型: 在声明函数时函数名的右侧
  2. 使用泛型: 形参/函数体
  3. 指定泛型的具体类型: 调用函数时函数名的右侧
  */
  function createArray2<T>(count: number, value: T) {
    const result: T[] = []
    for (let index = 0; index < count; index++) {
      result.push(value)
    }
    return result
  }
  const arr3 = createArray2<number>(5, 12.34)
  const arr4 = createArray2<string>(5, '12.34')

  console.log(arr3[0].toFixed())
  console.log(arr4[0].length)


  function swap <K, V> (a: K, b: V): [K, V] {
    return [a, b]
  }
  const result = swap<string, number>('abc', 123)
  console.log(result[0].length, result[1].toFixed())
})()